iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
Software Development

成為一名 Kotlin 後端攻城獅系列 第 21

Day 21 Kotlin 抽象化類別

  • 分享至 

  • xImage
  •  

昨天介紹完介面可以讓我們不用透過完整定義類別內容去給出一個模板,使用過其他物件導向語言的讀者應該會說,你的介面(interface) 可以做出具體函式,那這樣跟抽象類別(abstract class) 這個物件導向語言的概念有什麼區別?確實,在近期的 Kotlin 版本中在介面中加入了許多其他語言用抽象類別才有的功能模糊了兩者的界線,硬是要說的話差別大概是還剩下(?) 下面兩點

  1. 類別可以在定義時實作多個介面,然而只能實作一個抽象類別。

  2. 雖然介面可以使用具體函式,但他卻不能有狀態,也就是具體變數,唯一解方就是用 get 韓式讓這個抽象變數可以帶一個函式並返還值;反之抽象類別可以。

    interface I {
    
        val property: String
            get() = "field"
    		// val failedProperty: String = "field". // Compiler Error
    
    }
    
    abstract class A {
    
        val property: String = "field". // OK
    
    }
    
    class MyClass : I {
        ...
    }
    
    fun main() {
    
        val testClass = MyClass()
        print(testClass.property)	// "field"
    
    }
    
  3. 抽象類別可以像一般類別一樣擁有傳入變數,介面不具備這樣的功能。

和介面相同,抽象類別是一個不能直接生成物件的類別,它是只能讓其他類別繼承的模板,用於定義應該在一組相關類別之間共享的通用行為和屬性,同時允許每個子類別依據需求做出實作。

抽象化定義

抽象類別是使用 abstract 關鍵字聲明的。它提供了一種方法來定義在抽象類別本身中沒有實現的方法和屬性,但必須在其子類別中實現。抽象類別通常用於當您想要為一組相關的類別創建共同的結構時。

abstract class Shape {
    // 抽象屬性,沒有預設值
    abstract val area: Double

    // 抽象方法,沒有實現
    abstract fun calculateArea(): Double
}

除了類別可以做成抽象化外,其實抽象類別內的函式與變數可以使用 abstract 字樣定義成抽象的

  • 抽象變數:抽象類別可以聲明抽象變數,這些變數沒有初始值,必須由子類別實現。在上面的範例中,area 變數是抽象的,這意味著它必須在 Shape 的任何子類別中被實現。
  • 抽象函式:抽象類別也可以聲明抽象函式,這些方法沒有實現。子類別必須為這些抽象函式提供實現。Shape 類別中的 calculateArea() 方法就是一個抽象函式的例子。

參考資料


上一篇
Day 20 介面與實作
下一篇
Day 22 Kotlin Data Class
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言